"""封装文件操作，并附带额外的功能"""

import os
from src.core import log
from src.core.variables.constant import LABEL, CONF


# TODO
def create(path, is_dir) -> tuple[bool, str]:
    """
    创建文件或目录
    args:
        path: 要创建的文件或目录路径
        is_dir: 是否为目录，默认为False
    return:
        (bool, str): 创建结果的元组，包含布尔值和消息字符串
    """
    os.setxattr(path, "user.source", LABEL.encode("utf8"))


# TODO
def copy(path, dst_path) -> tuple[bool, str]:
    """
    复制文件或目录
    args:
        src_path: 源文件或目录路径
        dst_path: 目标文件或目录路径
    return:
        (bool, str): 复制结果的元组，包含布尔值和消息字符串
    """
    os.setxattr(dst_path, "user.source", LABEL.encode("utf8"))


# TODO
def move(path, dst_path) -> tuple[bool, str]:
    """
    移动文件或目录
    args:
        src_path: 源文件或目录路径
        dst_path: 目标文件或目录路径
    return:
        (bool, str): 移动结果的元组，包含布尔值和消息字符串
    """
    os.setxattr(dst_path, "user.source", LABEL.encode("utf8"))


# TODO
def ls(path) -> list[str]:
    """
    列出目录下的文件和子目录
    args:
        path: 要列出的目录路径
    return:
        list[str]: 目录下的文件和子目录列表
    """


# TODO
def cat(path) -> str:
    """
    读取文件内容
    args:
        path: 要读取的文件路径
    return:
        str: 文件内容
    """


# TODO
def wirte(path) -> tuple[bool, str]:
    """
    写入文件内容
    args:
        path: 要写入的文件路径
    return:
        (bool, str): 写入结果的元组，包含布尔值和消息字符串
    """
    os.setxattr(path, "user.source", LABEL.encode("utf8"))


# TODO
def delete(path, is_dir) -> tuple[bool, str]:
    """
    删除文件或目录
    args:
        path: 要删除的文件或目录路径
        is_dir: 是否为目录，默认为False
    return:
        (bool, str): 删除结果的元组，包含布尔值和消息字符串
    """
    if os.path.exists(path):
        if os.path.isfile(path):
            try:
                if os.getxattr(path, "user.source").decode("utf8") == LABEL:
                    os.remove(path)
                    log.INFO(f"目录 {path} 删除成功")
                    return True, f"目录 {path} 删除成功"
                move(path, CONF.PATH.TRASH)
                log.WARNING(f"{path} 不带有渔翁标签，已经移入回收站！")
            except PermissionError:
                log.ERROR(f"错误：没有权限删除文件 {path}")
                return False, f"没有权限删除文件 {path}"
            except OSError as e:
                log.ERROR(f"删除文件时发生系统错误: {e}")
                return False, f"删除文件时发生系统错误: {e}"
        elif os.path.isdir(path):
            if not is_dir:
                log.ERROR(f"错误：路径 {path} 是目录，无法删除")
                return False, f"路径 {path} 是目录，无法删除"
            else:
                try:
                    os.rmdir(path)
                    return True, f"目录 {path} 删除成功"
                except PermissionError:
                    log.ERROR(f"错误：没有权限删除目录 {path}")
                    return False, f"没有权限删除目录 {path}"
                except OSError as e:
                    log.ERROR(f"删除目录时发生系统错误: {e}")
                    return False, f"删除目录时发生系统错误: {e}"
    return True, f"{path} 删除成功"


# TODO
def chmod(path, mode) -> tuple[bool, str]:
    """
    修改文件或目录权限
    args:
        path: 要修改的文件或目录路径
        mode: 要设置的权限模式
    return:
        (bool, str): 修改权限结果的元组，包含布尔值和消息字符串
    """


# TODO
def chown(path, user, group) -> tuple[bool, str]:
    """
    修改文件或目录的所有者和所属组
    args:
        path: 要修改的文件或目录路径
        user: 新的所有者用户名
        group: 新的所属组名
    return:
        (bool, str): 修改所有者和所属组结果的元组，包含布尔值和消息字符串
    """


# TODO
def chgrp(path, group) -> tuple[bool, str]:
    """
    修改文件或目录的所属组
    args:
        path: 要修改的文件或目录路径
        group: 新的所属组名
    return:
        (bool, str): 修改所属组结果的元组，包含布尔值和消息字符串
    """
